import io
from typing import Any

import fitz
from fitz import Page
from pypdf import PdfReader, PdfWriter


class BasePDFService:
    """Базовый класс для работы с pdf документом"""

    def __init__(self, filename: str):
        self.filename = filename
        self.reader = fitz.open(self.filename)

    def replace_text(
        self,
        temp_file: io.BytesIO,
        replaces: dict[Any, Any],
    ) -> io.BytesIO:
        """
        Заменяем старый текст на новый
        :param temp_file: Временный файл для записи
        :param replaces: Словарь для замены {"старый текст": "новый текст"}
        :return: Возврашает временный файл
        """

        temp_file.seek(0)
        new_file = temp_file.read()
        for old, new in replaces.items():
            new_file = new_file.replace(old.encode(), new.encode())
            temp_file.seek(0)
            temp_file.write(new_file)

        return temp_file

    def replace_image(self, page: Page, xref: int, image_bytes: bytes) -> None:
        """
        Заменяем картинку на новую по id xref
        :param page: Страница документа
        :param xref: Id объекта в файле
        :param image_bytes: Данные новой картинки
        :return: None
        """
        page.replace_image(xref, stream=image_bytes)

    def add_watermark(self, watermark_filename: str) -> None:
        """
        Добавляем ватермарку на каждую страницу
        :param watermark_filename: Путь к jpg файлу с ватермаркой
        """

        for page in self.reader:
            page.insert_image(page.rect, filename=watermark_filename, overlay=False)

    def save_pdf_file(self) -> bytes:
        """
        Сохраняем готовый документ
        :return bytes: Контент готового документа
        """
        output = io.BytesIO()
        self.reader.save(output, garbage=3, deflate=False)
        output.seek(0)
        return output.read()
